#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

// int main()
// {
//     // 以写模式打开文件 "test"，如果文件不存在，则创建一个新文件
//     FILE* fp = fopen("test", "w");
//     // 检查文件是否成功打开
//     if(fp == NULL)
//     {
//         // 如果文件打开失败，输出错误信息并返回
//         perror("fopen");
//         return 1;
//     }
//     // 定义一个常量字符串，用于写入文件的每一行
//     const char* msg = "line";
//     int cnt = 1;  // 用于控制输出行号
//     // 循环写入 5 行数据到文件
//     while(cnt <= 5)
//     {
//         // 定义一个字符数组作为缓冲区来存储每一行的内容
//         char buffer[1024];
//         // 使用 snprintf 格式化字符串，生成包含行号的字符串
//         snprintf(buffer, sizeof(buffer), "%s%d\n", msg, cnt++);
//         // 将格式化后的字符串写入到文件中
//         fwrite(buffer, strlen(buffer), 1, fp);
//     }
//     // 关闭文件
//     fclose(fp);
//     // 程序正常结束
//     return 0;
// }

// int main()
// {
//     // 打开文件 "test" 以只读模式("r")读取文件内容
//     FILE* fp = fopen("test", "r");
//     // 如果文件打开失败，输出错误信息并返回
//     if(fp == NULL)
//     {
//         perror("fopen");  // 输出错误信息
//         return 1;  // 程序返回1表示出错
//     }
//     // 定义一个缓冲区用于存储每次读取的数据
//     char buffer[1024];
//     // 定义一个常量字符串 "line"，用于后续读取操作的判断
//     const char* msg = "line";
//     // 无限循环，不断读取文件
//     while (1)
//     {
//         // 使用 fread 读取文件内容，每次读取 "line" 长度 + 1 的字节数
//         size_t n = fread(buffer, 1, strlen(msg) + 1, fp);
//         // 如果读取的字节数大于0，说明读取成功
//         if(n > 0)
//         {
//             buffer[n] = 0;  // 确保缓冲区的末尾是以空字符'\0'结尾，形成一个有效的C字符串
//             printf("%s", buffer);  // 打印读取到的内容
//         }
//         // 如果到达文件末尾，退出循环
//         if(feof(fp)) break;
//     }
//     // 关闭文件
//     fclose(fp);
//     // 程序正常结束
//     return 0;
// }

// int main()
// {
//     //相当于fopen的'w'模式
//     int fd1 = open("exm1.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
//     //想当于fopen的'a'模式
//     int fd2 = open("exm2.txt", O_WRONLY | O_CREAT | O_APPEND, 0644);
    
//     //关闭文件
//     close(fd1);
//     close(fd2);
//     return 0;
// }

// int main()
// {
//     int fd = open("test", O_RDONLY);
//     if(fd == -1)
//     {
//         perror("Error opening file");
//         return 1;
//     }

//     char buffer[128] = { 0 };
//     ssize_t bytesRead = read(fd, buffer, sizeof(buffer));
//     if(bytesRead == -1)
//     {
//         perror("Error reading file");
//         close(fd);
//         return 1;
//     }
//     printf("%s\n", buffer);
//     close(fd);
//     return 0;
// }


// int main()
// {
//     const char* msg = "hello, world!\n";
//     int fd = open("test", O_WRONLY | O_CREAT | O_TRUNC, 0644);
//     if(fd == -1)
//     {
//         perror("Error opening file");
//         return 1;
//     }
    
//     ssize_t bytesWritten = write(fd, msg, strlen(msg));
//     if(bytesWritten == -1)
//     {
//         perror("Error writing to file");
//         close(fd);
//         return 1;
//     }

//     close(fd);
//     return 0;
// }

// int main() {
//     // 关闭文件描述符 1，即标准输出（stdout）
//     close(1);

//     // 打开或创建 "log.txt" 文件，以写模式打开
//     // O_WRONLY：以只写模式打开文件
//     // O_CREAT：如果文件不存在则创建它
//     // O_TRUNC：如果文件已经存在，清空文件内容
//     int fd = open("log.txt", O_WRONLY | O_CREAT | O_TRUNC);
    
//     // 检查文件是否成功打开
//     if (fd == -1) {
//         // 如果打开失败，输出错误信息并返回
//         perror("Failed to open log.txt");
//         return 1;
//     }

//     // 定义一个字符串，将要写入文件的内容
//     const char* msg = "hello, world!";

//     // 将消息写入文件，标准输出已经被关闭，实际写入的是文件描述符 fd（log.txt）
//     // 这里实际上是向文件 `log.txt` 写入内容，而不是输出到终端
//     write(fd, msg, strlen(msg));  // 注意，`1` 已经被关闭，此时 `write(1, ...)` 实际写入的是 `log.txt`

//     // 关闭文件描述符，释放资源
//     close(fd);

//     return 0;
// }

int main()
{
    const char* fstr = "fwrite\n";
    const char* str = "write\n";

    //C语言接口
    printf("printf\n");
    fprintf(stdout, "fpriintf\n");
    fwrite(fstr, strlen(fstr), 1, stdout);

    //系统调用
    write(1, str, strlen(str));

    fork();
    return 0;
}




